--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
scripts/ci/sync-github-release-assets.sh 66412c74389b272bbd7ced2f5071396e5031a59f (66412c74) Text, 4.78 KB
T8b949e#!/usr/bin/env bash
T8b949e# Download Windows/macOS build artifacts from GitHub Actions (build-release workflow)
T8b949e# and attach them to an existing Gitea release. Best-effort: missing platforms are skipped.
T8b949e#
T8b949e# Required env: TAG, GITHUB_REPOSITORY, GITHUB_PAT, GITEA_API_URL, GITEA_REPOSITORY, GITEA_TOKEN
Tffa657set -euo pipefail
Te6edf3TAGTff7b72=Ta5d6ff"Tffd700${Te6edf3TAGTb4b4b4:Tb4b4b4?set TAG to the release tag (e.g. v1.2.3)Tffd700}Ta5d6ff"
Te6edf3GITHUB_REPOSITORYTff7b72=Ta5d6ff"Tffd700${Te6edf3GITHUB_REPOSITORYTb4b4b4:Tb4b4b4?Tffd700}Ta5d6ff"
Te6edf3GITHUB_PATTff7b72=Ta5d6ff"Tffd700${Te6edf3GITHUB_PATTb4b4b4:Tb4b4b4?Tffd700}Ta5d6ff"
Te6edf3GITEA_API_URLTff7b72=Ta5d6ff"Tffd700${Te6edf3GITEA_API_URLTb4b4b4:Tb4b4b4?Tffd700}Ta5d6ff"
Te6edf3GITEA_REPOSITORYTff7b72=Ta5d6ff"Tffd700${Te6edf3GITEA_REPOSITORYTb4b4b4:Tb4b4b4?Tffd700}Ta5d6ff"
Te6edf3GITEA_TOKENTff7b72=Ta5d6ff"Tffd700${Te6edf3GITEA_TOKENTb4b4b4:Tb4b4b4?Tffd700}Ta5d6ff"
Te6edf3GITEA_API_URLTff7b72=Ta5d6ff"Tffd700${Te6edf3GITEA_API_URLTb4b4b4%/Tffd700}Ta5d6ff"
Te6edf3GH_APITff7b72=Ta5d6ff"Ta5d6ffhttps://api.github.com/repos/Tffd700${Te6edf3GITHUB_REPOSITORYTffd700}Ta5d6ff"
Te6edf3AUTH_GHTff7b72=Tff7b72(-H Ta5d6ff"Ta5d6ffAuthorization: Bearer Tffd700${Te6edf3GITHUB_PATTffd700}Ta5d6ff" -H Ta5d6ff"Accept: application/vnd.github+json" -H Ta5d6ff"X-GitHub-Api-Version: 2022-11-28"Tff7b72)
Te6edf3AUTH_GITEATff7b72=Tff7b72(-H Ta5d6ff"Ta5d6ffAuthorization: token Tffd700${Te6edf3GITEA_TOKENTffd700}Ta5d6ff" -H Ta5d6ff"Accept: application/json"Tff7b72)
Te6edf3WORKDIRTff7b72=Tff7b72$(mktemp -dTff7b72)
Tffa657trap Ta5d6ff'rm -rf "${WORKDIR}"' EXIT
enc_tagTff7b72(Tff7b72) Tff7b72{
Tffa657printf Ta5d6ff'%s' Ta5d6ff"Te6edf3$1Ta5d6ff" Tb4b4b4| jq -sRr @uri
Tff7b72}
logTff7b72(Tff7b72) Tff7b72{
Tffa657printf Ta5d6ff'%s\n' Ta5d6ff"Te6edf3$*Ta5d6ff" >Tb4b4b4&T79c0ff2
Tff7b72}
Tff7b72if ! Tffa657command -v jq >/dev/null T79c0ff2>Tb4b4b4&T79c0ff1Tb4b4b4; Tff7b72then
log Ta5d6ff"Error: jq is required."
Tffa657exit T79c0ff1
Tff7b72fi
Te6edf3COMMIT_SHATff7b72=Ta5d6ff""
Tff7b72if Te6edf3COMMIT_JSONTff7b72=Tff7b72$(curl -sS -f Ta5d6ff"Tffd700${Te6edf3AUTH_GHTb4b4b4[@]Tffd700}Ta5d6ff" Ta5d6ff"Tffd700${Te6edf3GH_APITffd700}Ta5d6ff/commits/Tff7b72$(enc_tag Ta5d6ff"Te6edf3$TAGTa5d6ff"Tff7b72)Ta5d6ff" T79c0ff2>/dev/nullTff7b72)Tb4b4b4; Tff7b72then
Te6edf3COMMIT_SHATff7b72=Tff7b72$(Tffa657printf Ta5d6ff'%s' Ta5d6ff"Te6edf3$COMMIT_JSONTa5d6ff" Tb4b4b4| jq -r Ta5d6ff'.sha // empty'Tff7b72)
Tff7b72fi
Te6edf3TAG_ENCTff7b72=Tff7b72$(enc_tag Ta5d6ff"Te6edf3$TAGTa5d6ff"Tff7b72)
Te6edf3RUNS_URLTff7b72=Ta5d6ff"Tffd700${Te6edf3GH_APITffd700}Ta5d6ff/actions/workflows/build-release.yml/runs?event=push&branch=Tffd700${Te6edf3TAG_ENCTffd700}Ta5d6ff&per_page=30Ta5d6ff"
Te6edf3RUN_IDTff7b72=Ta5d6ff""
Tff7b72if Te6edf3RUNS_JSONTff7b72=Tff7b72$(curl -sS -f Ta5d6ff"Tffd700${Te6edf3AUTH_GHTb4b4b4[@]Tffd700}Ta5d6ff" Ta5d6ff"Te6edf3$RUNS_URLTa5d6ff" T79c0ff2>/dev/nullTff7b72)Tb4b4b4; Tff7b72then
Te6edf3RUN_IDTff7b72=Tff7b72$(Tffa657printf Ta5d6ff'%s' Ta5d6ff"Te6edf3$RUNS_JSONTa5d6ff" Tb4b4b4| jq -r Ta5d6ff'
[.workflow_runs[] | select(.conclusion == "success")]
| sort_by(.created_at) | reverse | .[0].id // empty
'Tff7b72)
Tff7b72fi
Tff7b72if Tff7b72[ -z Ta5d6ff"Te6edf3$RUN_IDTa5d6ff" Tff7b72] Tff7b72&& Tff7b72[ -n Ta5d6ff"Te6edf3$COMMIT_SHATa5d6ff" Tff7b72]Tb4b4b4; Tff7b72then
Tff7b72if Te6edf3RUNS_JSONTff7b72=Tff7b72$(curl -sS -f Ta5d6ff"Tffd700${Te6edf3AUTH_GHTb4b4b4[@]Tffd700}Ta5d6ff" Ta5d6ff"Tffd700${Te6edf3GH_APITffd700}Ta5d6ff/actions/workflows/build-release.yml/runs?per_page=50Ta5d6ff" T79c0ff2>/dev/nullTff7b72)Tb4b4b4; Tff7b72then
Te6edf3RUN_IDTff7b72=Tff7b72$(Tffa657printf Ta5d6ff'%s' Ta5d6ff"Te6edf3$RUNS_JSONTa5d6ff" Tb4b4b4| jq -r --arg sha Ta5d6ff"Te6edf3$COMMIT_SHATa5d6ff" Ta5d6ff'
[.workflow_runs[] | select(.head_sha == $sha and .conclusion == "success")]
| sort_by(.created_at) | reverse | .[0].id // empty
'Tff7b72)
Tff7b72fi
Tff7b72fi
Tff7b72if Tff7b72[ -z Ta5d6ff"Te6edf3$RUN_IDTa5d6ff" Tff7b72]Tb4b4b4; Tff7b72then
log Ta5d6ff"Ta5d6ffNo successful GitHub Actions run found for build-release.yml (tag=Tffd700${Te6edf3TAGTffd700}Ta5d6ff). Skipping GitHub artifact sync.Ta5d6ff"
Tffa657exit T79c0ff0
Tff7b72fi
log Ta5d6ff"Ta5d6ffUsing GitHub workflow run id=Tffd700${Te6edf3RUN_IDTffd700}Ta5d6ff for tag Tffd700${Te6edf3TAGTffd700}Ta5d6ff"
Te6edf3ART_JSONTff7b72=Tff7b72$(curl -sS Ta5d6ff"Tffd700${Te6edf3AUTH_GHTb4b4b4[@]Tffd700}Ta5d6ff" Ta5d6ff"Tffd700${Te6edf3GH_APITffd700}Ta5d6ff/actions/runs/Tffd700${Te6edf3RUN_IDTffd700}Ta5d6ff/artifacts?per_page=100Ta5d6ff" Tff7b72|| Tffa657trueTff7b72)
Te6edf3NTff7b72=Tff7b72$(Tffa657printf Ta5d6ff'%s' Ta5d6ff"Tffd700${Te6edf3ART_JSONTff7b72:-Tb4b4b4{Tffd700}Ta5d6ff}Ta5d6ff" Tb4b4b4| jq -r Ta5d6ff'(.artifacts // []) | length'Tff7b72)
Tff7b72if Tff7b72[ Ta5d6ff"Tffd700${Te6edf3NTff7b72:-Te6edf30Tffd700}Ta5d6ff" -eq T79c0ff0 Tff7b72]Tb4b4b4; Tff7b72then
log Ta5d6ff"Ta5d6ffNo artifacts on GitHub run Tffd700${Te6edf3RUN_IDTffd700}Ta5d6ff (or API error). Nothing to download.Ta5d6ff"
Tffa657exit T79c0ff0
Tff7b72fi
Te6edf3STAGETff7b72=Ta5d6ff"Tffd700${Te6edf3WORKDIRTffd700}Ta5d6ff/stageTa5d6ff"
mkdir -p Ta5d6ff"Te6edf3$STAGETa5d6ff"
Tffa657printf Ta5d6ff'%s' Ta5d6ff"Te6edf3$ART_JSONTa5d6ff" Tb4b4b4| jq -r Ta5d6ff'.artifacts[] | "\(.id)|\(.name)|\(.archive_download_url)"' Tb4b4b4| Tff7b72while Te6edf3IFSTff7b72=Ta5d6ff'|' Tffa657read -r _art_id art_name dl_urlTb4b4b4; Tff7b72do
Tff7b72case Ta5d6ff"Te6edf3$art_nameTa5d6ff" Tff7b72in
meshchatx-windows-*Tb4b4b4|meshchatx-macos-*Tff7b72) Tb4b4b4;Tb4b4b4;
*Tff7b72)
log Ta5d6ff"Ta5d6ffSkipping artifact with unexpected name: Tffd700${Te6edf3art_nameTffd700}Ta5d6ff"
Tff7b72continue
Tb4b4b4;Tb4b4b4;
Tff7b72esac
Te6edf3ZIPTff7b72=Ta5d6ff"Tffd700${Te6edf3WORKDIRTffd700}Ta5d6ff/Tff7b72$(Tffa657echo Ta5d6ff"Te6edf3$art_nameTa5d6ff" Tb4b4b4| tr Ta5d6ff'/' Ta5d6ff'_'Tff7b72)Ta5d6ff.zipTa5d6ff"
log Ta5d6ff"Ta5d6ffDownloading Tffd700${Te6edf3art_nameTffd700}Ta5d6ff...Ta5d6ff"
Tff7b72if ! curl -sS -fL Ta5d6ff"Tffd700${Te6edf3AUTH_GHTb4b4b4[@]Tffd700}Ta5d6ff" -o Ta5d6ff"Te6edf3$ZIPTa5d6ff" Ta5d6ff"Te6edf3$dl_urlTa5d6ff"Tb4b4b4; Tff7b72then
log Ta5d6ff"Ta5d6ffWarning: failed to download Tffd700${Te6edf3art_nameTffd700}Ta5d6ff; continuing.Ta5d6ff"
Tff7b72continue
Tff7b72fi
Te6edf3EXTff7b72=Ta5d6ff"Tffd700${Te6edf3WORKDIRTffd700}Ta5d6ff/ex-Tffd700${Te6edf3art_nameTffd700}Ta5d6ff"
mkdir -p Ta5d6ff"Te6edf3$EXTa5d6ff"
Tff7b72if ! unzip -q -o Ta5d6ff"Te6edf3$ZIPTa5d6ff" -d Ta5d6ff"Te6edf3$EXTa5d6ff" T79c0ff2>/dev/nullTb4b4b4; Tff7b72then
log Ta5d6ff"Ta5d6ffWarning: unzip failed for Tffd700${Te6edf3art_nameTffd700}Ta5d6ff; continuing.Ta5d6ff"
Tff7b72continue
Tff7b72fi
find Ta5d6ff"Te6edf3$EXTa5d6ff" -type f Tffea00\( -name Ta5d6ff'*.exe' -o -name Ta5d6ff'*.dmg' -o -name Ta5d6ff'*.blockmap' -o -name Ta5d6ff'*.yml' -o -name Ta5d6ff'*.yaml' Tffea00\) -print0 T79c0ff2>/dev/null Tffea00\
Tb4b4b4| Tff7b72while Te6edf3IFSTff7b72= Tffa657read -r -d Ta5d6ff'' fTb4b4b4; Tff7b72do
Te6edf3baseTff7b72=Tff7b72$(basename Ta5d6ff"Te6edf3$fTa5d6ff"Tff7b72)
cp -f Ta5d6ff"Te6edf3$fTa5d6ff" Ta5d6ff"Tffd700${Te6edf3STAGETffd700}Ta5d6ff/Tffd700${Te6edf3baseTffd700}Ta5d6ff"
log Ta5d6ff"Ta5d6ffStaged Tffd700${Te6edf3baseTffd700}Ta5d6ff"
Tff7b72done
Tff7b72done
Te6edf3STAGED_NTff7b72=Tff7b72$(find Ta5d6ff"Te6edf3$STAGETa5d6ff" -mindepth T79c0ff1 -maxdepth T79c0ff1 -type f T79c0ff2>/dev/null Tb4b4b4| wc -lTff7b72)
Te6edf3STAGED_NTff7b72=Tffd700${Te6edf3STAGED_NTb4b4b4//[[Tb4b4b4:Te6edf3spaceTb4b4b4:Tb4b4b4]]/Tffd700}
Tff7b72if Tff7b72[ Ta5d6ff"Tffd700${Te6edf3STAGED_NTff7b72:-Te6edf30Tffd700}Ta5d6ff" -eq T79c0ff0 Tff7b72]Tb4b4b4; Tff7b72then
log Ta5d6ff"No .exe/.dmg (or related) files extracted from GitHub artifacts. Nothing to upload."
Tffa657exit T79c0ff0
Tff7b72fi
Te6edf3REL_JSONTff7b72=Tff7b72$(curl -sS Ta5d6ff"Tffd700${Te6edf3AUTH_GITEATb4b4b4[@]Tffd700}Ta5d6ff" Ta5d6ff"Tffd700${Te6edf3GITEA_API_URLTffd700}Ta5d6ff/api/v1/repos/Tffd700${Te6edf3GITEA_REPOSITORYTffd700}Ta5d6ff/releases/tags/Tffd700${Te6edf3TAGTffd700}Ta5d6ff"Tff7b72)
Te6edf3REL_IDTff7b72=Tff7b72$(Tffa657printf Ta5d6ff'%s' Ta5d6ff"Te6edf3$REL_JSONTa5d6ff" Tb4b4b4| jq -r Ta5d6ff'.id // empty'Tff7b72)
Tff7b72if Tff7b72[ -z Ta5d6ff"Te6edf3$REL_IDTa5d6ff" Tff7b72] Tff7b72|| Tff7b72[ Ta5d6ff"Te6edf3$REL_IDTa5d6ff" Tff7b72= Ta5d6ff"null" Tff7b72]Tb4b4b4; Tff7b72then
log Ta5d6ff"Ta5d6ffError: No Gitea release for tag 'Tffd700${Te6edf3TAGTffd700}Ta5d6ff'. Create the release first (e.g. push the tag so .gitea/workflows/build.yml runs).Ta5d6ff"
Tffa657exit T79c0ff1
Tff7b72fi
log Ta5d6ff"Ta5d6ffUploading to Gitea release id=Tffd700${Te6edf3REL_IDTffd700}Ta5d6ff (Tffd700${Te6edf3GITEA_REPOSITORYTffd700}Ta5d6ff@Tffd700${Te6edf3TAGTffd700}Ta5d6ff)Ta5d6ff"
find Ta5d6ff"Te6edf3$STAGETa5d6ff" -maxdepth T79c0ff1 -type f -print0 Tb4b4b4| Tff7b72while Te6edf3IFSTff7b72= Tffa657read -r -d Ta5d6ff'' fTb4b4b4; Tff7b72do
Te6edf3baseTff7b72=Tff7b72$(basename Ta5d6ff"Te6edf3$fTa5d6ff"Tff7b72)
Te6edf3NAME_ENCTff7b72=Tff7b72$(Tffa657printf Ta5d6ff'%s' Ta5d6ff"Te6edf3$baseTa5d6ff" Tb4b4b4| jq -sRr @uriTff7b72)
Tff7b72if curl -sS -f Ta5d6ff"Tffd700${Te6edf3AUTH_GITEATb4b4b4[@]Tffd700}Ta5d6ff" -F Ta5d6ff"Ta5d6ffattachment=@Tffd700${Te6edf3fTffd700}Ta5d6ff" Tffea00\
Ta5d6ff"Tffd700${Te6edf3GITEA_API_URLTffd700}Ta5d6ff/api/v1/repos/Tffd700${Te6edf3GITEA_REPOSITORYTffd700}Ta5d6ff/releases/Tffd700${Te6edf3REL_IDTffd700}Ta5d6ff/assets?name=Tffd700${Te6edf3NAME_ENCTffd700}Ta5d6ff" >/dev/nullTb4b4b4; Tff7b72then
log Ta5d6ff"Ta5d6ffUploaded Tffd700${Te6edf3baseTffd700}Ta5d6ff"
Tff7b72else
log Ta5d6ff"Ta5d6ffWarning: upload failed or duplicate for Tffd700${Te6edf3baseTffd700}Ta5d6ff; continuing.Ta5d6ff"
Tff7b72fi
Tff7b72done
log Ta5d6ff"Done."
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────